package com.example.common.model;

import com.example.common.constants.CommonConstants;

import java.util.HashMap;

/**
 * 通用返回结果类，用于封装API响应数据
 * 该类继承了HashMap，因此可以直接使用Map的相关方法
 *
 * @param <T> 泛型，用于存放返回的数据类型
 */
public class Result<T> extends HashMap<String, Object>
{

    /**
     * 成功响应，携带数据
     *
     * @param data 返回的数据，泛型允许任何类型
     * @param <T>  泛型，自动推断类型
     * @return Result对象，包含成功代码、消息和提供的数据
     */
    public static <T> Result<T> success(T data)
    {
        Result<T> result = new Result<>();
        result.put("code", CommonConstants.SUCCESS_CODE);
        result.put("message", CommonConstants.SUCCESS_MESSAGE);
        result.put("data", data);
        return result;
    }

    /**
     * 成功响应，不携带数据
     *
     * @param <T> 泛型，自动推断类型
     * @return Result对象，包含成功代码和消息，但没有数据
     */
    public static <T> Result<T> success()
    {
        Result<T> result = new Result<>();
        result.put("code", CommonConstants.SUCCESS_CODE);
        result.put("message", CommonConstants.SUCCESS_MESSAGE);
        return result;
    }

    /**
     * 失败响应，不携带数据
     *
     * @param <T> 泛型，自动推断类型
     * @return Result对象，包含错误代码和消息，但没有数据
     */
    public static <T> Result<T> error()
    {
        Result<T> result = new Result<>();
        result.put("code", CommonConstants.ERROR_CODE);
        result.put("message", CommonConstants.ERROR_MESSAGE);
        return result;
    }

    /**
     * 失败响应，自定义错误码和消息
     *
     * @param code    错误码
     * @param message 错误消息
     * @param <T>     泛型，自动推断类型
     * @return Result对象，包含自定义的错误码和消息，但没有数据
     */
    public static <T> Result<T> error(int code, String message)
    {
        Result<T> result = new Result<>();
        result.put("code", code);
        result.put("message", message);
        return result;
    }

    /**
     * 失败响应，自定义消息
     *
     * @param message 错误消息
     * @param <T>     泛型，自动推断类型
     * @return Result对象，包含默认错误码和自定义消息，但没有数据
     */
    public static <T> Result<T> error(String message)
    {
        Result<T> result = new Result<>();
        result.put("code", CommonConstants.ERROR_CODE);
        result.put("message", message);
        return result;
    }

    /**
     * 自定义响应
     *
     * @param code    自定义响应码
     * @param message 自定义响应消息
     * @param data    自定义响应数据
     * @param <T>     泛型，自动推断类型
     * @return Result对象，包含自定义的响应码、消息和数据
     */
    public static <T> Result<T> of(int code, String message, T data)
    {
        Result<T> result = new Result<>();
        result.put("code", code);
        result.put("message", message);
        result.put("data", data);
        return result;
    }
}
